/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved.
 */

import { HvigorLogger } from '../../../log/hvigor-log.js';

const log = HvigorLogger.getLogger('hvigor-task-path');

/**
 * Task的path中的分隔符
 * 由于存在module之间的任务依赖，因此在全局的DAG图中需要通过module名和task名共同来作为唯一标识区分
 * 由于存在工程project和module的name是一致的情况(module之间name不允许重名)
 * 因此，Task的path采用如下规则
 * 1.project的task path统一使用`:${taskName}`的形式
 * 2.module的task path统一使用`${moduleName}:${taskName}`的形式
 *
 */
const _keySeparator = ':';

/**
 * 判断传入的taskPath是否是一个合法的路径,并返回分隔后的字符串数组
 *
 * @param {string} taskPath
 * @returns {string[]}
 */
export function validateTaskPath(taskPath: string): string[] {
  const params: string[] = taskPath.split(_keySeparator);
  if (params.length < 2) {
    log.printErrorExit('INVALID_TASK_NODE_KEY', [taskPath]);
  }

  return params;
}

/**
 * 通过Task的path分割获取其所属的Module name
 *
 * @param {string} taskPath
 * @returns {string}
 */
export function getModuleNameFromTaskPath(taskPath: string): string {
  return validateTaskPath(taskPath)[0];
}

/**
 * 通过Task的path分割获取其所属的Task name
 *
 * @param {string} taskPath
 * @returns {string}
 */
export function getTaskNameFromTaskPath(taskPath: string): string {
  return validateTaskPath(taskPath)[1];
}

/**
 * 拼接module name和task name
 *
 * @param {string} moduleName 如果是project则为“”,如果是module则是moduleName
 * @param {string} taskName taskName
 * @returns {string} taskPath
 */
export function union(moduleName: string, taskName: string): string {
  return moduleName.concat(_keySeparator).concat(taskName);
}

export const parseTaskPath = (taskPath: string) => {
  const info: string[] = validateTaskPath(taskPath);
  return { moduleName: info[0], taskName: info[1] };
};
